Перейти к основному содержимому
Версия: 2.0

Cybertrace

Интеграция с Kaspersky Cybertrace

Данное руководство описывает быструю настройку интеграции Solar TI Feeds Agent с Kaspersky Cybertrace для автоматической загрузки индикаторов компрометации (IoC).


Предварительные требования

  • Установленный и настроенный Solar TI Feeds Agent
  • Учётные данные для доступа к Kaspersky Cybertrace (Basic-аутентификация)
  • Действительный JWT-токен для доступа к Solar TI Feeds API

Конфигурация интеграции

Интеграция автоматизирует выгрузку индикаторов из Solar TI Feeds в Kaspersky Cybertrace. Для подключения к СЗИ используется аутентификация типа BasicAuth.

Основные компоненты интеграции:

КомпонентНазначение
FeedsAPIGeneratorЗагрузка данных из Solar TI Feeds API
FeedsDBSinkСохранение данных в локальную SQLite-базу
FeedsDBGeneratorЧтение данных из базы для обработки
FeedsFailedDBGeneratorПовторная обработка ошибочных записей
MapperПреобразование JSON-данных в плоскую структуру
FilterФильтрация индикаторов по условиям
CyberTraceSinkОтправка данных в Kaspersky Cybertrace

Переменные окружения

Для работы интеграции необходимо определить следующие переменные окружения в файле docker-compose.yml:

ПеременнаяНазначение
TIC_AGENT_API_URLАдрес сервера Solar TI Feeds API
TIC_AGENT_API_TOKENJWT-токен для аутентификации
TIC_AGENT_SERVICE_URLURL-адрес сервера Kaspersky Cybertrace (например, https://cybertrace.example.com:8080)
TIC_AGENT_SERVICE_USERИмя пользователя для Basic-аутентификации в Cybertrace
TIC_AGENT_SERVICE_PASSWORDПароль для Basic-аутентификации в Cybertrace

Структура pipeline для Cybertrace

В актуальной версии конфигурации используется один комплексный pipeline, а не отдельные pipeline для каждого фида. Pipeline состоит из двух частей:

Pipeline 1: feeds-api (загрузка данных)

КомпонентПараметрыОписание
FeedsAPIGeneratorschedule = scheduleCron10MinCfgЗапрос данных каждые 10 минут
types = ["ipv4", "domain", "md5", "sha1", "sha256"]Типы загружаемых индикаторов
FeedsDBSinkСохранение в SQLite

Pipeline 2: feeds-cybertrace (обработка и выгрузка)

КомпонентПараметрыОписание
FeedsDBGeneratorschedule = scheduleCron5MinCfgЧтение данных из БД каждые 5 минут
FeedsFailedDBGeneratorschedule = scheduleCron10MinCfgПовторная обработка ошибок
Mapperjsonpath + rulesПреобразование JSON в необходимый формат
FilterУсловие фильтрацииОтбор индикаторов для отправки
CyberTraceSinksupplier = "ti_feeds_v2"Отправка в Cybertrace

Условие фильтрации (Filter)

В cybertrace_pipeline.pkl настроен фильтр, который пропускает только следующие индикаторы:

filters {
"""
action == "DELETE" || any(feeds_names, {lower(#) in ["vpn", "tor", "proxy", "fstec"]}) || zone == "MALICIOUS"
"""
}

Условия отбора:

  • Индикаторы с действием DELETE
  • Индикаторы из фидов: vpn, tor, proxy, fstec
  • Индикаторы с зоной MALICIOUS

Справочник параметров для Kaspersky Cybertrace

Параметры ServerCfg (подключение к Cybertrace)

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписаниеПример
credentialsBasicAuth | JwtAuth | HeaderAuth | NoAuthnew NoAuth {}ДаДанные для аутентификацииcredentials = new BasicAuth { username = "user" password = "pass" }
addressAddressДаURL-адрес сервера Cybertraceaddress = "https://cybertrace.example.com:8080"
timeoutDuration1.minНетТаймаут запросовtimeout = 120.s
retriesInt5НетКоличество повторных попытокretries = 3
retryTimeoutDuration10.sНетНачальная задержка между попыткамиretryTimeout = 5.s
retryMaxTimeoutDuration50.sНетМаксимальная задержка между попыткамиretryMaxTimeout = 30.s
insecureSkipVerifyBooleanfalseНетОтключение проверки SSL-сертификатаinsecureSkipVerify = true

Параметры CyberTraceSink

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписание
serverServerCfgДаКонфигурация подключения к серверу Cybertrace
columnsListing<String>ДаСписок колонок для отправки в Cybertrace
supplierStringДаИдентификатор поставщика данных (например, "ti_feeds_v2")
confidenceInt80НетУровень доверия к индикаторам (1-100)
retentionDuration0.minНетВремя жизни индикаторов (0 = бессрочно)
vendorString"Solar"НетИмя вендора
cleanListBooleanfalseНетОчищать список перед загрузкой

Полный код конфигурационного файла для интеграции с Cybertrace

📄 Нажмите, чтобы показать/скрыть cybertrace_pipeline.pkl
amends "package://pkg.pkl-lang.org/github.com/pipelane/pipelaner/pipelaner@1.3.1#/Pipelaner.pkl"
import "package://pkg.pkl-lang.org/github.com/pipelane/pipelaner/pipelaner@1.3.1#/source/Components.pkl"
import "../internal/agent.pkl"
import "../internal/templates.pkl"


pipelines {
new Components.Pipeline {
name = "feeds-api"
inputs {
new agent.FeedsAPIGenerator {
name = "feeds-api-generator"
server = templates.serverJwtApiCfg
schedule = templates.scheduleCron10MinCfg
filter = new agent.FeedsAPIRequestParams {
types = new Listing {
"ipv4"
"domain"
"md5"
"sha1"
"sha256"
}
}
}
}
sinks {
new agent.FeedsDBSink {
name = "feeds-db-sink"
inputs {
"feeds-api-generator"
}
}
}
}

new Components.Pipeline {
name = "feeds-cybertrace"
inputs {
new agent.FeedsDBGenerator {
name = "feeds-cybertrace-generator"
schedule = templates.scheduleCron5MinCfg
}
new agent.FeedsFailedDBGenerator {
name = "feeds-failed-cybertrace-generator"
feedGenName = "feeds-cybertrace-generator"
schedule = templates.scheduleCron10MinCfg
}
}
transforms {
new agent.Mapper {
name = "feeds-cybertrace-mapper"
inputs {
"feeds-cybertrace-generator"
"feeds-failed-cybertrace-generator"
}
jsonpath = new Mapping {
["feeds_names"] = "$.feeds[*]..name"
["actions"] = "$.feeds[*]..action"
["heuristics"] = "$.network.heuristics[*].description"
["verdicts"] = "$.file.verdicts[*]"
["file_names"] = "$.file.file_identifiers[*]"
}
rules = new Mapping {
["id"] = "id"
["value"] = "value"
["action"] =
"""
any(actions, {# in ["UPDATE", "CREATE"]}) ? "UPDATE" : "DELETE"
"""

["first_seen"] = "first_seen"
["last_seen"] = "last_seen"
["description"] = "description"
["categories"] = "categories"
["detects"] = """
len(heuristics) > 0 ? heuristics : len(verdicts) > 0 ? verdicts : ""
"""
["zone"] = "zone"

["related_reports"] = """
let reports = map(related_objects, {#.type == "REPORT" ? replace(#.value,"\\n"," ") : ""});
join(filter(reports, {# != ""}), ",")
"""
["related_threat_actors"] = """
let actors = map(related_objects, {#.type == "THREAT_ACTOR" ? #.value : ""});
join(filter(actors, {# != ""}), ",")
"""
["related_file_hashes"] = """
let files = map(related_objects, {#.type in ["MD5", "SHA1", "SHA256", "FILE"] ? #.value : ""});
join(filter(files, {# != ""}), ",")
"""
["related_indicators"] = """
let indicators = map(related_objects, {#.type in ["IPV4", "IPV6", "DOMAIN", "URL", "SOCKETV4", "SOCKETV6"] ? #.value : ""});
join(filter(indicators, {# != ""}), ",")
"""

["portal_link"] = "portal_url"
["contexts"] = "contexts"
["attributes"] = "attributes"
["vulnerabilities"] = "cve"
}
}
new agent.Filter {
inputs {
"feeds-cybertrace-mapper"
}
name = "feeds-cybertrace-filter"
filters {
"""
action == "DELETE" || any(feeds_names, {lower(#) in ["vpn", "tor", "proxy", "fstec"]}) || zone == "MALICIOUS"
"""
}
}
}
sinks {
new agent.CyberTraceSink {
name = "cybertace-sink"
inputs {
"feeds-cybertrace-filter"
}
server = new agent.ServerCfg {
credentials = new agent.BasicAuth {
username = read("env:TIC_AGENT_SERVICE_USER")
password = read("env:TIC_AGENT_SERVICE_PASSWORD")
}
address = read("env:TIC_AGENT_SERVICE_URL")
insecureSkipVerify = true
}
columns = new Listing {
"first_seen"
"last_seen"
"description"
"feeds_names"
"categories"
"detects"
"zone"
"file_names"
"related_reports"
"related_threat_actors"
"related_file_hashes"
"related_indicators"
"portal_link"
"contexts"
"attributes"
"vulnerabilities"
}
supplier = "ti_feeds_v2"
}
}
}
}

settings = templates.baseSettings

Мониторинг результатов работы интеграции

После запуска агента убедитесь в корректности работы интеграции:

ПроверкаДействие
Проверка логов агентаПросмотрите логи в директории ./workdir/logs на наличие ошибок или предупреждений
Верификация в CybertraceВ интерфейсе Kaspersky Cybertrace убедитесь, что индикаторы загружаются с указанным supplier = "ti_feeds_v2"
Проверка фильтрацииУбедитесь, что загружаются только индикаторы, соответствующие условиям фильтра

Примечание: Логи агента также можно просмотреть в реальном времени с помощью команды docker logs {CONTAINER_NAME}.